package com.iwhalecloud.bss.kite.cucc.service.attr.handler;

import com.google.common.collect.Lists;
import com.iwhalecloud.bss.kite.common.constant.KeyConsts;
import com.iwhalecloud.bss.kite.common.util.KiteListUtils;
import com.iwhalecloud.bss.kite.common.util.KiteObjectUtils;
import com.iwhalecloud.bss.kite.common.util.KiteStringUtils;
import com.iwhalecloud.bss.kite.cucc.common.constant.LocalKeyConsts;
import com.iwhalecloud.bss.kite.dataservice.cache.AttrValueCache;
import com.iwhalecloud.bss.kite.dataservice.cache.ProductCache;
import com.iwhalecloud.bss.kite.dataservice.entity.AttrValue;
import com.iwhalecloud.bss.kite.manager.api.IOperateSceneInstService;
import com.iwhalecloud.bss.kite.manager.api.IQuerySceneInstService;
import com.iwhalecloud.bss.kite.manager.enums.ActionType;
import com.iwhalecloud.bss.kite.manager.inst.KiteAttr;
import com.iwhalecloud.bss.kite.manager.inst.KiteInst;
import com.iwhalecloud.bss.kite.manager.inst.KiteProdInst;
import com.iwhalecloud.bss.kite.manager.inst.KiteProdInstFunc;
import com.iwhalecloud.bss.kite.service.attr.AttrData;
import com.iwhalecloud.bss.kite.service.attr.handler.AbstractAttrHandler;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @Description: 启用固定IP
 * 选择共享的APN，启用固定IP为：否，且灰色不可修改；
 * 选择复用的APN，启用固定IP不展示，为空；
 * @author zhangsong
 * @date 2021年6月15日
 * @version V1.0
 * @Package com.iwhalecloud.bss.kite.cucc.service.attr.handler
 */
public class UseFixedIpAttrHandler extends AbstractAttrHandler<KiteInst, AttrData> {

    @Autowired
    private IQuerySceneInstService querySceneInstService;

    @Autowired
    IOperateSceneInstService operateSceneInstService;

    @Override
    public void onShow(KiteAttr attr, KiteInst inst, AttrData data) {
        // 取所有接入类产品
        List<KiteProdInst> kiteProdInstList = querySceneInstService.listProdInsts(data.getSceneInstId());
        final KiteProdInst[] prodInsts = new KiteProdInst[1];
        if (KiteListUtils.isNotEmpty(kiteProdInstList)) {
            kiteProdInstList.stream().forEach(prodInst -> {
                List<KiteProdInstFunc> kiteProdInstFuncs = querySceneInstService.listProdInstFuncs(data.getCustId(), prodInst.getProdInstId());
                if (KiteListUtils.isNotEmpty(kiteProdInstFuncs)) {
                    kiteProdInstFuncs.stream().forEach(kiteProdInstFunc -> {
                        if (KiteStringUtils.equalsAny(ProductCache.get(kiteProdInstFunc.getSpecId()).getProdNbr(), LocalKeyConsts.FUNC_PROD_ID_APN, LocalKeyConsts.FUNC_PROD_ID_YF5GAPN)) {
                            prodInsts[0] = prodInst;
                            return;
                        }
                    });
                }
            });
        }
        if (prodInsts[0] == null) {
            return;
        }
        // 处理APN设置下拉值，从当前实例下获取已经创建好的APN
        List<KiteProdInstFunc> kiteProdInstFuncs = Lists.newArrayList();
        if (!KiteObjectUtils.isEmpty(prodInsts) && !KiteObjectUtils.isEmpty(prodInsts[0])) {
            kiteProdInstFuncs = querySceneInstService.listProdInstFuncsByProdId(data.getCustId(), prodInsts[0].getProdInstId(), LocalKeyConsts.FUNC_PROD_ID_APN);
            if (KiteListUtils.isEmpty(kiteProdInstFuncs)) {
                kiteProdInstFuncs = querySceneInstService.listProdInstFuncsByProdId(data.getCustId(), prodInsts[0].getProdInstId(), LocalKeyConsts.FUNC_PROD_ID_NBAPN);
            }
            if (KiteListUtils.isEmpty(kiteProdInstFuncs)) {
                kiteProdInstFuncs = querySceneInstService.listProdInstFuncsByProdId(data.getCustId(), prodInsts[0].getProdInstId(), LocalKeyConsts.FUNC_PROD_ID_5GAPN);
            }
            if (KiteListUtils.isEmpty(kiteProdInstFuncs)) {
                kiteProdInstFuncs = querySceneInstService.listProdInstFuncsByProdId(data.getCustId(), prodInsts[0].getProdInstId(), LocalKeyConsts.FUNC_PROD_ID_YF5GAPN);
            }
        }
        if (!KiteListUtils.isEmpty(kiteProdInstFuncs)) {
            // 通信计划关联的APN
            String apnRelaAttrValue = inst.getAttrValue("200004034");
            kiteProdInstFuncs = kiteProdInstFuncs.stream().filter(t -> !ActionType.D.equals(t.getActionType())).collect(Collectors.toList());
            kiteProdInstFuncs.forEach(funcProdInst -> {
                // 获取APN 新增APN方式，根据不同的APN的方式，启用固定IP属性对应不同的设置
                KiteAttr wayAttr = funcProdInst.getAttr("200003996");
                // 使用共享APN 100006950 200003997 共享APN域名
                // 使用已创建APN 100006951  200003998 复用APN域名
                // 我要定制 100006952 200004135 APN名称
                if (Objects.nonNull(wayAttr)) {
                    if ("100006952".equals(wayAttr.getValue())) {
                        if (!KiteStringUtils.isIndexOf(apnRelaAttrValue, funcProdInst.getAttrValue("200004135"), ",")) {
                            return;
                        }
                        attr.setIsEdit(KeyConsts.IFTRUE_T);
                        attr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_M);
                    } else if ("100006950".equals(wayAttr.getValue())) {
                        if (!KiteStringUtils.isIndexOf(apnRelaAttrValue, funcProdInst.getAttrValue("200003997"), ",")) {
                            return;
                        }
                        attr.setIsEdit(KeyConsts.IFTRUE_F);
                        attr.setValue("1_0000107");
                        attr.setValueDesc(Optional.ofNullable(AttrValueCache.getAttrValue(attr.getAttrId(), "1_0000107")).map(AttrValue::getAttrValueName).orElse("否"));
                        attr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_M);
                    } else if ("100006951".equals(wayAttr.getValue())) {
                        if (!KiteStringUtils.isIndexOf(apnRelaAttrValue, funcProdInst.getAttrValue("200003998"), ",")) {
                            return;
                        }
                        attr.setValue("1_0000107");
                        attr.setValueDesc(Optional.ofNullable(AttrValueCache.getAttrValue(attr.getAttrId(), "1_0000107")).map(AttrValue::getAttrValueName).orElse("否"));
                        attr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                    }
                }
            });
        } else {
            attr.setIsEdit(KeyConsts.IFTRUE_T);
            attr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_M);
        }

        operateSceneInstService.setAttr(data.getSceneInstId(), inst.getInstType(), inst.getInstId(), attr);
    }
}

